package com.revzone.demo001.entity.OtherEntity;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;

import java.lang.reflect.Field;

public class BaseEntity<T> {
    /**
     * 根据实体类的属性值构造QueryWrapper对象
     * @param entity 实体类对象
     * @param <T> 实体类类型
     * @return QueryWrapper对象
     */
    public static <T extends BaseEntity<T>> QueryWrapper<T> getQueryWrapper(T entity) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();  // 构造QueryWrapper对象
        Field[] fields = entity.getClass().getDeclaredFields();  // 获取所有字段
        for (Field field : fields) {  // 遍历字段
            try {
                field.setAccessible(true);
                Object value = field.get(entity);  // 获取字段的值
                if (value != null && !"".equals(value) && String.class.equals(field.getType())) {  // 如果值不为空或空字符串且属性类型为String，则进行模糊查询条件构造
                    TableFieldInfo tableFieldInfo = getFieldInfo(entity.getClass(), field);  // 获取映射的数据库字段名
                    wrapper.like(tableFieldInfo.getColumn(), value.toString());  // 构造模糊查询条件
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException("模糊查询：getQueryWrapper error");  // 抛出运行时异常
            }
        }
        return wrapper;  // 返回QueryWrapper对象
    }

    /**
     * 通过实体类和字段属性获取映射的数据库字段信息
     * @param clazz 实体类类型
     * @param field 字段属性
     * @return 映射的数据库字段信息
     */
    private static TableFieldInfo getFieldInfo(Class<?> clazz, Field field) {
        TableInfo info = TableInfoHelper.getTableInfo(clazz);  // 获取实体类对应的TableInfo对象
        return info.getFieldList().stream()
                .filter(e -> e.getProperty().equals(field.getName()))  // 过滤出与字段属性名一致的TableFieldInfo对象
                .findFirst()
                .orElseThrow(() -> new RuntimeException("getFieldInfo error"));  // 如果找不到对应的TableFieldInfo对象则抛出运行时异常
    }

}
